package com.kgame5.xtank3d.model.shot {
import kgame5.enginex.EntityMessageVO;
import kgame5.enginex.EntityVO;
import kgame5.enginex.comp.ICollideP2P;
import kgame5.enginex.comp.IRender;
import kgame5.enginex.entityimpl.LogicSpacialEntity;
import kgame5.k3d.core.obj3d.hardvo.HardVO;
import kgame5.k3d.core.obj3d.node3d.Node3D;

import com.kgame5.xtank3d.GameEnum;
import com.kgame5.xtank3d.control.ShotBlastCommand;
import com.kgame5.xtank3d.vo.ShotVO;

/**
 * @author kk
 */
public class ShotEntity extends LogicSpacialEntity implements IRender,ICollideP2P{
	
	public var vo:ShotVO;
	
	private var comp:ShotViewComp;
	private var collideList:Vector.<EntityVO>;
	
	public function ShotEntity(p_vo:ShotVO){
		super(p_vo);
		vo=p_vo;
		
		//--comp--
		comp=new ShotViewComp(vo);
		comp.update(vo);//设置好初始位置
		
		//--collideList--
		collideList=new Vector.<EntityVO>();
	}

	//---------------IP2P---------------
	//用于碰撞的HardVO.返回供GameWorldX引擎使用
	public function getCollideHardVO():HardVO{
		return _vo.hardVO;
	}
	
	public function addCollideItem(p_vo:EntityVO):void{
		collideList.push(p_vo);
	}
	public function getCollideList():Vector.<EntityVO>{
		return collideList;
	}
	public function clearCollideList():void{
		collideList=new Vector.<EntityVO>();
	}
	
	//---------------IP2E-----------------
	
	
	//---------------Logic--------------
	override public function updateLogic():void{
		
		var b0:Boolean=this.spacialManager.ProcessShotFly(vo.hardVO);
		//var b1:Boolean=this.testHitActor();
		var b2:Boolean=this.testHitGround();
		if(b0||b2){//b1||
			this.sendCommand(ShotBlastCommand.NAME,vo);
		}
	}
	
	//-切换fsm状态
	override public function handleEntityMessage(mvo:EntityMessageVO):void{
		
	}
	
	//---------------IRender-----------------
	//简单情况不需要使用viewComp
	public function updateView():void{
		comp.update(vo);
	}
	
	public function getNode3D():Node3D{
		return comp.getNode3D();
	}
	
	public function getShadow3D():Node3D{
		return comp.getShadow3D();
	}
	
	//-------------实用工具-------------
	//检测是否撞上了地面，如果撞上，则把位置设置成地面
	private function testHitGround():Boolean{
		//落地就停在地面上
		if(vo.hardVO.v3d_p.y<=vo.hardVO.bball.R/2){//判断炮弹是否落地
			vo.hardVO.v3d_p.y=vo.hardVO.bball.R/2;
			return true;
		}
		return false;
	}
	//检测是否撞上了某个fms,并设置好碰撞点
	//对于这些actor，因为他们是动的，所有不用四叉树（因为每次都要对死叉树插入，反而不如用brudeForce）
	private function testHitActor():Boolean{
		
		var aim:EntityVO=null;
		for(var i:int=0;i<collideList.length;i++){
			aim=collideList[i] as EntityVO;
			if(aim.cateID==GameEnum.CATEID_SHOT || aim.cateID==GameEnum.CATEID_TANK){
				return true;
			}
			
//			if(GameRule.isHitable(shotVO, actorAim)){//如果是可撞
//				//1,自己速度减小
//				onCollide();
//				
//				//2,被撞的东西速度为一半。这个是因为客户端比服务器要慢一些
//				actorAim.hardVO.v3d_v.x/=2;
//				actorAim.hardVO.v3d_v.z/=2;
//				
//				return true;
//			}
		}
		
		return false;
		
	}
}//end of class
}
